package com.github.excel.listener;

import cn.hutool.core.collection.CollUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.github.excel.entity.args.excel.ExcelImportData;
import com.github.excel.service.IExcelFileService;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.List;

/**
 * easyExcel监听器，用于处理读取到的数据
 */

public class ExcelFileDataListener implements ReadListener<ExcelImportData> {

    @Autowired
    private IExcelFileService excelFileService;

    //单笔缓存数据量
    private static final int BATCH_SIZE = 1000;
    //临时存储
    private List<ExcelImportData> batchDataList = new ArrayList<>();

    //读取每一行数据
    @Override
    public void invoke(ExcelImportData data, AnalysisContext analysisContext) {
        //检查数据合法性
        if (validateData(data)){
            //有效数据添加到list中
            batchDataList.add(data);
        } else {
            //处理无效数据，例如记录日志或跳过
        }

        //临时存储达到1000条时，插入数据库
        if (batchDataList.size() >= BATCH_SIZE){
            this.processBatch();
        }
        System.out.println(data.toString());
    }

    //所有数据解析完成之后的操作
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        //如果还有未处理的数据，进行处理
        if (CollUtil.isNotEmpty(batchDataList)){
            processBatch();
        }
    }

    /**
     * 读取时，数据验证
     */
    private boolean validateData(ExcelImportData data){
        //验证字段属性是否合法，如果合法返回true
        return true;
    }

    /**
     * 数据处理
     */
    private void processBatch(){
        int retryCount = 0;
        while (retryCount < 3){
            try {

                //ToDo 尝试写入数据库操作

                //写入完成之后，清空批量数据，以便下次批量处理
                batchDataList.clear();
                break;
            } catch (Exception e) {
                //重试次数增加
                retryCount++;
                //如果重试3次都失败，记录错误日志
                if (retryCount >= 3){
                    //记录错误日志
                    this.logError(e,batchDataList);
                }
            }
        }
    }

    //记录错误日志
    private void logError(Exception e,List<ExcelImportData> errorDataList){
        //这里可以实现错误日志记录的逻辑
        //可以记录异常信息和导致失败的数据
    }
}
